home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / utils / file / fileutil.13 / fileutil / fileutils-3.13 / src / mkdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-25  |  4.3 KB  |  167 lines

  1. /* mkdir -- make directories
  2.    Copyright (C) 90, 95, 1996 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software Foundation,
  16.    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  17.  
  18. /* Options:
  19.    -p, --parent        Ensure that the given path(s) exist:
  20.             Make any missing parent directories for each argument.
  21.             Parent dirs default to umask modified by `u+wx'.
  22.             Do not consider an argument directory that already
  23.             exists to be an error.
  24.    -m, --mode=mode    Set the mode of created directories to `mode', which is
  25.             symbolic as in chmod and uses the umask as a point of
  26.             departure.
  27.  
  28.    David MacKenzie <djm@ai.mit.edu>  */
  29.  
  30. #include <config.h>
  31. #include <stdio.h>
  32. #include <getopt.h>
  33. #include <sys/types.h>
  34.  
  35. #include "system.h"
  36. #include "modechange.h"
  37. #include "makepath.h"
  38. #include "error.h"
  39.  
  40. /* The name this program was run with. */
  41. char *program_name;
  42.  
  43. /* If nonzero, ensure that all parents of the specified directory exist.  */
  44. static int path_mode;
  45.  
  46. /* If nonzero, display usage information and exit.  */
  47. static int show_help;
  48.  
  49. /* If nonzero, print the version on standard output and exit.  */
  50. static int show_version;
  51.  
  52. static struct option const longopts[] =
  53. {
  54.   {"mode", required_argument, NULL, 'm'},
  55.   {"parents", no_argument, &path_mode, 1},
  56.   {"help", no_argument, &show_help, 1},
  57.   {"verbose", no_argument, NULL, 2},
  58.   {"version", no_argument, &show_version, 1},
  59.   {NULL, 0, NULL, 0}
  60. };
  61.  
  62. static void
  63. usage (int status)
  64. {
  65.   if (status != 0)
  66.     fprintf (stderr, _("Try `%s --help' for more information.\n"),
  67.          program_name);
  68.   else
  69.     {
  70.       printf (_("Usage: %s [OPTION] DIRECTORY...\n"), program_name);
  71.       printf (_("\
  72. Create the DIRECTORY(ies), if they do not already exist.\n\
  73. \n\
  74.   -p, --parents     no error if existing, make parent directories as needed\n\
  75.   -m, --mode=MODE   set permission mode (as in chmod), not rwxrwxrwx - umask\n\
  76.       --verbose     print a message for each created directory\n\
  77.       --help        display this help and exit\n\
  78.       --version     output version information and exit\n"));
  79.     }
  80.   exit (status);
  81. }
  82.  
  83. int
  84. main (int argc, char **argv)
  85. {
  86.   unsigned int newmode;
  87.   unsigned int parent_mode;
  88.   char *symbolic_mode = NULL;
  89.   const char *verbose_fmt_string = NULL;
  90.   int errors = 0;
  91.   int optc;
  92.  
  93.   program_name = argv[0];
  94.   setlocale (LC_ALL, "");
  95.   bindtextdomain (PACKAGE, LOCALEDIR);
  96.   textdomain (PACKAGE);
  97.  
  98.   path_mode = 0;
  99.  
  100.   while ((optc = getopt_long (argc, argv, "pm:", longopts, (int *) 0)) != EOF)
  101.     {
  102.       switch (optc)
  103.     {
  104.     case 0:            /* Long option. */
  105.       break;
  106.     case 'p':
  107.       path_mode = 1;
  108.       break;
  109.     case 'm':
  110.       symbolic_mode = optarg;
  111.       break;
  112.     case 2: /* --verbose  */
  113.       verbose_fmt_string = _("created directory `%s'");
  114.       break;
  115.     default:
  116.       usage (1);
  117.     }
  118.     }
  119.  
  120.   if (show_version)
  121.     {
  122.       printf ("mkdir - %s\n", PACKAGE_VERSION);
  123.       exit (0);
  124.     }
  125.  
  126.   if (show_help)
  127.     usage (0);
  128.  
  129.   if (optind == argc)
  130.     {
  131.       error (0, 0, _("too few arguments"));
  132.       usage (1);
  133.     }
  134.  
  135.   newmode = 0777 & ~umask (0);
  136.   parent_mode = newmode | 0300;    /* u+wx */
  137.   if (symbolic_mode)
  138.     {
  139.       struct mode_change *change = mode_compile (symbolic_mode, 0);
  140.       if (change == MODE_INVALID)
  141.     error (1, 0, _("invalid mode `%s'"), symbolic_mode);
  142.       else if (change == MODE_MEMORY_EXHAUSTED)
  143.     error (1, 0, _("virtual memory exhausted"));
  144.       newmode = mode_adjust (newmode, change);
  145.     }
  146.  
  147.   for (; optind < argc; ++optind)
  148.     {
  149.       if (path_mode)
  150.     {
  151.       errors |= make_path (argv[optind], newmode, parent_mode,
  152.                    -1, -1, 1, verbose_fmt_string);
  153.     }
  154.       else if (mkdir (argv[optind], newmode))
  155.     {
  156.       error (0, errno, _("cannot make directory `%s'"), argv[optind]);
  157.       errors = 1;
  158.     }
  159.       else if (verbose_fmt_string)
  160.     {
  161.       error (0, 0, verbose_fmt_string, argv[optind]);
  162.     }
  163.     }
  164.  
  165.   exit (errors);
  166. }
  167.